package com.linkgie.galaxyframework.context;

@HomeConfig
public interface ApplicationHome extends ConfigurationHome {

	// ----------- 一级目录 ------------------

	public static final String CONFIG_DIR_NAME = "conf";

	/**
	 * 节点服务实例的日志目录；
	 */
	public static final String LOG_DIR_NAME = "logs";

	/**
	 * 指定日志文件输出的根目录的系统属性名称；
	 * <p>
	 * 
	 * 此属性用于类路径中的默认日志配置文件模板 {@value #SYSTTEM_DEFAULT_LOGGING_CONFIG_CLASSPATH} ;
	 */
	public static final String SYSTEM_PROPERTY_NAME_OF_LOG_ROOT_DIR = "APP_LOG_ROOT";

	/**
	 * 应用服务器配置文件名称；
	 */
	public static final String APPLICATION_CONFIG_FILE_NAME = "application.conf";

	/**
	 * 日志配置文件名称；
	 */
	public static final String LOGGING_CONFIG_FILE_NAME = "log4j2.xml";

	/**
	 * 指定 Log4J 的日志配置文件路径的系统属性名称；
	 */
	public static final String SYSTEM_PROPERTY_NAME_OF_LOG4J_CONFIG = "logging.config";

	// 应用配置文件默认模板的类路径；
	public static final String DEFAULT_APP_CONFIG_CLASSPATH = "/template/conf/default-application.conf";

	// 系统提供的默认日志配置文件的类路径；
	public static final String SYSTTEM_DEFAULT_LOGGING_CONFIG_CLASSPATH = "/template/conf/default-log4j2.xml";

	// 应用的默认日志配置文件的类路径；
	public static final String APP_DEFAULT_LOGGING_CONFIG_CLASSPATH = "/conf/log4j2.xml";


	/**
	 * 配置目录；
	 * 
	 * @return
	 */
	@HomePath(value = { CONFIG_DIR_NAME }, type = HomePathType.DIR)
	String getConfigDirectory();



	/**
	 * 日志输出目录；
	 * <p>
	 * 
	 * 把 SSH 控制台的管理员初始临时密码文件输出目录也设置为日志目录；
	 * <p>
	 * 
	 * SSH 控制台的管理员初始临时密码将同时以两种方式方式输出：<br>
	 * 一种是以独立文件输出到日志目录下，文件名为 {@link SshProperties#TEMP_ROOT_PASSWORD_FILE_NAME};
	 * <br>
	 * 另一种是以 WARN 日志级别输出到日志文件，如果将日志级别设置为 ERROR 及以上将使得此种方式的输出不可见；
	 * 
	 * @return
	 */
	@HomePath(value = {
			LOG_DIR_NAME }, type = HomePathType.DIR, systemProperties = SYSTEM_PROPERTY_NAME_OF_LOG_ROOT_DIR)
	String getLogDirectory();


	/**
	 * 服务器配置文件；
	 * <p>
	 * 
	 * @return
	 */
	@HomePath(value = { CONFIG_DIR_NAME, APPLICATION_CONFIG_FILE_NAME }, defaultResource = DEFAULT_APP_CONFIG_CLASSPATH)
	@Override
	String getApplicationConfigFile();

	/**
	 * 日志配置文件；
	 * <p>
	 * 
	 * @return
	 */
	@HomePath(value = { CONFIG_DIR_NAME,
			LOGGING_CONFIG_FILE_NAME }, systemProperties = SYSTEM_PROPERTY_NAME_OF_LOG4J_CONFIG)
	String getLoggingConfigFile();
}
